<?php
/**
 * 汉字转化为拼音类
 */
class Pinyin {
	/**
	 * 汉字ASCII码库
	 * @var array
	 */
	protected $lib;
	/**
	 * 构造函数
	 * @return void
	 */
	public function __construct() {}
	/**
	 * 汉字转化并输出拼音
	 * @param string $str 所要转化拼音的汉字
	 * @param boolean $utf8  汉字编码是否为utf8
	 * @return string
	 */
	public function output($str, $utf8 = true) {
		//参数分析
		if (!$str) {
			return false;
		}
		//编码转换.
		$str = ($utf8 == true) ? $this->iconvStr('utf-8', 'gbk', $str) : $str;
		$num = strlen($str);
		$pinyin = '';
		for ($i = 0; $i < $num; $i++) {
			$temp = ord(substr($str, $i, 1));
			if ($temp > 160) {
				$temp2 = ord(substr($str, ++$i, 1));
				$temp = $temp * 256 + $temp2 - 65536;
			}
			$pinyin .= $this->num2str($temp);
		}
		//输出的拼音编码转换.
		return ($utf8 == true) ? $this->iconvStr('gbk', 'utf-8', $pinyin) : $pinyin;
	}
	/**
	 * 将ASCII编码转化为字符串.
	 * @param integer $num
	 * @return string
	 */
	protected function num2str($num) {
		if (!$this->lib) {
			$this->parse_lib();
		}
		if ($num > 0 && $num < 160) {
			return chr($num);
		} elseif ($num < -20319 || $num > -10247) {
			return '';
		} else {
			$total = sizeof($this->lib) - 1;
			for ($i = $total; $i >= 0; $i--) {
				if ($this->lib[$i][1] <= $num) {
					break;
				}
			}
			return $this->lib[$i][0];
		}
	}
	/**
	 * 返回汉字编码库
	 * @return array
	 */
	protected function parse_lib() {
		return $this->lib = array(
			array("a", -20319),
			array("ai", -20317),
			array("an", -20304),
			array("ang", -20295),
			array("ao", -20292),
			array("ba", -20283),
			array("bai", -20265),
			array("ban", -20257),
			array("bang", -20242),
			array("bao", -20230),
			array("bei", -20051),
			array("ben", -20036),
			array("beng", -20032),
			array("bi", -20026),
			array("bian", -20002),
			array("biao", -19990),
			array("bie", -19986),
			array("bin", -19982),
			array("bing", -19976),
			array("bo", -19805),
			array("bu", -19784),
			array("ca", -19775),
			array("cai", -19774),
			array("can", -19763),
			array("cang", -19756),
			array("cao", -19751),
			array("ce", -19746),
			array("ceng", -19741),
			array("cha", -19739),
			array("chai", -19728),
			array("chan", -19725),
			array("chang", -19715),
			array("chao", -19540),
			array("che", -19531),
			array("chen", -19525),
			array("cheng", -19515),
			array("chi", -19500),
			array("chong", -19484),
			array("chou", -19479),
			array("chu", -19467),
			array("chuai", -19289),
			array("chuan", -19288),
			array("chuang", -19281),
			array("chui", -19275),
			array("chun", -19270),
			array("chuo", -19263),
			array("ci", -19261),
			array("cong", -19249),
			array("cou", -19243),
			array("cu", -19242),
			array("cuan", -19238),
			array("cui", -19235),
			array("cun", -19227),
			array("cuo", -19224),
			array("da", -19218),
			array("dai", -19212),
			array("dan", -19038),
			array("dang", -19023),
			array("dao", -19018),
			array("de", -19006),
			array("deng", -19003),
			array("di", -18996),
			array("dian", -18977),
			array("diao", -18961),
			array("die", -18952),
			array("ding", -18783),
			array("diu", -18774),
			array("dong", -18773),
			array("dou", -18763),
			array("du", -18756),
			array("duan", -18741),
			array("dui", -18735),
			array("dun", -18731),
			array("duo", -18722),
			array("e", -18710),
			array("en", -18697),
			array("er", -18696),
			array("fa", -18526),
			array("fan", -18518),
			array("fang", -18501),
			array("fei", -18490),
			array("fen", -18478),
			array("feng", -18463),
			array("fo", -18448),
			array("fou", -18447),
			array("fu", -18446),
			array("ga", -18239),
			array("gai", -18237),
			array("gan", -18231),
			array("gang", -18220),
			array("gao", -18211),
			array("ge", -18201),
			array("gei", -18184),
			array("gen", -18183),
			array("geng", -18181),
			array("gong", -18012),
			array("gou", -17997),
			array("gu", -17988),
			array("gua", -17970),
			array("guai", -17964),
			array("guan", -17961),
			array("guang", -17950),
			array("gui", -17947),
			array("gun", -17931),
			array("guo", -17928),
			array("ha", -17922),
			array("hai", -17759),
			array("han", -17752),
			array("hang", -17733),
			array("hao", -17730),
			array("he", -17721),
			array("hei", -17703),
			array("hen", -17701),
			array("heng", -17697),
			array("hong", -17692),
			array("hou", -17683),
			array("hu", -17676),
			array("hua", -17496),
			array("huai", -17487),
			array("huan", -17482),
			array("huang", -17468),
			array("hui", -17454),
			array("hun", -17433),
			array("huo", -17427),
			array("ji", -17417),
			array("jia", -17202),
			array("jian", -17185),
			array("jiang", -16983),
			array("jiao", -16970),
			array("jie", -16942),
			array("jin", -16915),
			array("jing", -16733),
			array("jiong", -16708),
			array("jiu", -16706),
			array("ju", -16689),
			array("juan", -16664),
			array("jue", -16657),
			array("jun", -16647),
			array("ka", -16474),
			array("kai", -16470),
			array("kan", -16465),
			array("kang", -16459),
			array("kao", -16452),
			array("ke", -16448),
			array("ken", -16433),
			array("keng", -16429),
			array("kong", -16427),
			array("kou", -16423),
			array("ku", -16419),
			array("kua", -16412),
			array("kuai", -16407),
			array("kuan", -16403),
			array("kuang", -16401),
			array("kui", -16393),
			array("kun", -16220),
			array("kuo", -16216),
			array("la", -16212),
			array("lai", -16205),
			array("lan", -16202),
			array("lang", -16187),
			array("lao", -16180),
			array("le", -16171),
			array("lei", -16169),
			array("leng", -16158),
			array("li", -16155),
			array("lia", -15959),
			array("lian", -15958),
			array("liang", -15944),
			array("liao", -15933),
			array("lie", -15920),
			array("lin", -15915),
			array("ling", -15903),
			array("liu", -15889),
			array("long", -15878),
			array("lou", -15707),
			array("lu", -15701),
			array("lv", -15681),
			array("luan", -15667),
			array("lue", -15661),
			array("lun", -15659),
			array("luo", -15652),
			array("ma", -15640),
			array("mai", -15631),
			array("man", -15625),
			array("mang", -15454),
			array("mao", -15448),
			array("me", -15436),
			array("mei", -15435),
			array("men", -15419),
			array("meng", -15416),
			array("mi", -15408),
			array("mian", -15394),
			array("miao", -15385),
			array("mie", -15377),
			array("min", -15375),
			array("ming", -15369),
			array("miu", -15363),
			array("mo", -15362),
			array("mou", -15183),
			array("mu", -15180),
			array("na", -15165),
			array("nai", -15158),
			array("nan", -15153),
			array("nang", -15150),
			array("nao", -15149),
			array("ne", -15144),
			array("nei", -15143),
			array("nen", -15141),
			array("neng", -15140),
			array("ni", -15139),
			array("nian", -15128),
			array("niang", -15121),
			array("niao", -15119),
			array("nie", -15117),
			array("nin", -15110),
			array("ning", -15109),
			array("niu", -14941),
			array("nong", -14937),
			array("nu", -14933),
			array("nv", -14930),
			array("nuan", -14929),
			array("nue", -14928),
			array("nuo", -14926),
			array("o", -14922),
			array("ou", -14921),
			array("pa", -14914),
			array("pai", -14908),
			array("pan", -14902),
			array("pang", -14894),
			array("pao", -14889),
			array("pei", -14882),
			array("pen", -14873),
			array("peng", -14871),
			array("pi", -14857),
			array("pian", -14678),
			array("piao", -14674),
			array("pie", -14670),
			array("pin", -14668),
			array("ping", -14663),
			array("po", -14654),
			array("pu", -14645),
			array("qi", -14630),
			array("qia", -14594),
			array("qian", -14429),
			array("qiang", -14407),
			array("qiao", -14399),
			array("qie", -14384),
			array("qin", -14379),
			array("qing", -14368),
			array("qiong", -14355),
			array("qiu", -14353),
			array("qu", -14345),
			array("quan", -14170),
			array("que", -14159),
			array("qun", -14151),
			array("ran", -14149),
			array("rang", -14145),
			array("rao", -14140),
			array("re", -14137),
			array("ren", -14135),
			array("reng", -14125),
			array("ri", -14123),
			array("rong", -14122),
			array("rou", -14112),
			array("ru", -14109),
			array("ruan", -14099),
			array("rui", -14097),
			array("run", -14094),
			array("ruo", -14092),
			array("sa", -14090),
			array("sai", -14087),
			array("san", -14083),
			array("sang", -13917),
			array("sao", -13914),
			array("se", -13910),
			array("sen", -13907),
			array("seng", -13906),
			array("sha", -13905),
			array("shai", -13896),
			array("shan", -13894),
			array("shang", -13878),
			array("shao", -13870),
			array("she", -13859),
			array("shen", -13847),
			array("sheng", -13831),
			array("shi", -13658),
			array("shou", -13611),
			array("shu", -13601),
			array("shua", -13406),
			array("shuai", -13404),
			array("shuan", -13400),
			array("shuang", -13398),
			array("shui", -13395),
			array("shun", -13391),
			array("shuo", -13387),
			array("si", -13383),
			array("song", -13367),
			array("sou", -13359),
			array("su", -13356),
			array("suan", -13343),
			array("sui", -13340),
			array("sun", -13329),
			array("suo", -13326),
			array("ta", -13318),
			array("tai", -13147),
			array("tan", -13138),
			array("tang", -13120),
			array("tao", -13107),
			array("te", -13096),
			array("teng", -13095),
			array("ti", -13091),
			array("tian", -13076),
			array("tiao", -13068),
			array("tie", -13063),
			array("ting", -13060),
			array("tong", -12888),
			array("tou", -12875),
			array("tu", -12871),
			array("tuan", -12860),
			array("tui", -12858),
			array("tun", -12852),
			array("tuo", -12849),
			array("wa", -12838),
			array("wai", -12831),
			array("wan", -12829),
			array("wang", -12812),
			array("wei", -12802),
			array("wen", -12607),
			array("weng", -12597),
			array("wo", -12594),
			array("wu", -12585),
			array("xi", -12556),
			array("xia", -12359),
			array("xian", -12346),
			array("xiang", -12320),
			array("xiao", -12300),
			array("xie", -12120),
			array("xin", -12099),
			array("xing", -12089),
			array("xiong", -12074),
			array("xiu", -12067),
			array("xu", -12058),
			array("xuan", -12039),
			array("xue", -11867),
			array("xun", -11861),
			array("ya", -11847),
			array("yan", -11831),
			array("yang", -11798),
			array("yao", -11781),
			array("ye", -11604),
			array("yi", -11589),
			array("yin", -11536),
			array("ying", -11358),
			array("yo", -11340),
			array("yo", -11340),
			array("yong", -11339),
			array("you", -11324),
			array("yu", -11303),
			array("yuan", -11097),
			array("yue", -11077),
			array("yun", -11067),
			array("za", -11055),
			array("zai", -11052),
			array("zan", -11045),
			array("zang", -11041),
			array("zao", -11038),
			array("ze", -11024),
			array("zei", -11020),
			array("zen", -11019),
			array("zeng", -11018),
			array("zha", -11014),
			array("zhai", -10838),
			array("zhan", -10832),
			array("zhang", -10815),
			array("zhao", -10800),
			array("zhe", -10790),
			array("zhen", -10780),
			array("zheng", -10764),
			array("zhi", -10587),
			array("zhong", -10544),
			array("zhou", -10533),
			array("zhu", -10519),
			array("zhua", -10331),
			array("zhuai", -10329),
			array("zhuan", -10328),
			array("zhuang", -10322),
			array("zhui", -10315),
			array("zhun", -10309),
			array("zhuo", -10307),
			array("zi", -10296),
			array("zong", -10281),
			array("zou", -10274),
			array("zu", -10270),
			array("zuan", -10262),
			array("zui", -10260),
			array("zun", -10256),
			array("zuo", -10254),
		);
	}
	/**
	 * 编码转换
	 * @param type $from
	 * @param type $to
	 * @param type $fContents
	 * @return type
	 */
	protected function iconvStr($from, $to, $fContents) {
		if (is_string($fContents)) {
			if (function_exists('mb_convert_encoding')) {
				return mb_convert_encoding($fContents, $to, $from);
			} else if (function_exists('iconv')) {
				return iconv($from, $to, $fContents);
			} else {
				return $fContents;
			}
		}
	}
	/**
	 * 析构函数
	 * @access public
	 * @return void
	 */
	public function __destruct() {
		if (isset($this->lib)) {
			unset($this->lib);
		}
	}
}